package edu.unicauca.opentextbook.controladores;

import edu.unicauca.opentextbook.entidades.Usuario;
import edu.unicauca.opentextbook.fachadas.UsuarioFacade;
import java.io.Serializable;
import java.sql.SQLException;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@ManagedBean(name = "usuarioController")
@ViewScoped
public class UsuarioController extends BaseController implements Serializable {

    //EJBs
    @EJB
    private UsuarioFacade usuarioFacade;
    //Objetos
    private Usuario usuario;

    //Metodos
    @PostConstruct
    public void init() {
        usuario = new Usuario();
    }

    /*
     * Método para registrar un nuevo usuario
     */
    public void registrar() {
        try {
            userTransaction.begin();

            usuarioFacade.create(usuario);
            commitTransaction();

            anadirMensajeInfo("Registro Exitoso");

            usuario = new Usuario();
        } catch (Exception ex) {
            //Capturar la excepción de unicidad o mostrar un error general
            if (ex instanceof SQLException) {
                if (ex.getLocalizedMessage().contains("OPENTEXTBOOK.UK_NICK_USUARIO")) {
                    anadirMensajeError("El Nick ya ha sido registrado");
                } else if (ex.getLocalizedMessage().contains("OPENTEXTBOOK.UK_EMAIL_USUARIO")) {
                    anadirMensajeError("El Correo ya ha sido registrado");
                } else {
                    anadirMensajeError("Error al registrar, por favor contacte al Administrador");
                }
            } else {
                anadirMensajeError("Error al registrar, por favor contacte al Administrador");
            }
        }
    }

    /*
     * Método utilizado para cancelar el registro de un usuario 
     * y redireccionar a la página principal.
     */
    public String cancelarRegistro() {
        usuario = new Usuario();

        return "/faces/index?faces-redirect=true";
    }

    //Converter
    @FacesConverter(forClass = Usuario.class)
    public static class UsuarioControllerConverter implements Converter {

        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            UsuarioController controller = (UsuarioController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "usuarioController");
            return controller.usuarioFacade.find(getKey(value));
        }

        int getKey(String value) {
            int key;
            key = Integer.parseInt(value);
            return key;
        }

        String getStringKey(int value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Usuario) {
                Usuario o = (Usuario) object;
                return getStringKey(o.getIdUsuario());
            } else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + Usuario.class.getName());
            }
        }
    }

    //Getters y Setters
    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
}
